【图像】【OpenCV鱼眼矫正】一、 主要API解读

您所在的位置:网站首页 opencv 棋盘格矫正 【图像】【OpenCV鱼眼矫正】一、 主要API解读

【图像】【OpenCV鱼眼矫正】一、 主要API解读

2023-09-25 23:49| 来源: 网络整理| 查看: 265

目录 一、代码流程1. fisheye::calibrate();2. fisheye::initUndistortRectifyMap();3. remap()

一、代码流程

用OpenCV进行鱼眼相机矫正的代码很多,大家可以上网搜索,也可以下载博主的代码。

但是,不管参考哪家程序,用到的主要API总是这三个:

- fisheye::calibrate(); //标定相机,获取内参、外参、畸变系数 - fisheye::initUndistortRectifyMap(); //利用内参和畸变系数,获取重投影矩阵 - remap(); //根据重投影矩阵,对畸变图像进行重投影,获得矫正图

下面将简要介绍各函数的功能。

1. fisheye::calibrate();

fisheye::calibrate函数在OpenCV中的声明如下:

double cv::fisheye::calibrate ( InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, const Size & image_size, InputOutputArray K, InputOutputArray D, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags = 0, TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 100, DBL_EPSILON) )

其中各形参的作用在网上有很多文章介绍,本文不再赘述。

这里只简单介绍其输入输出:

输入:

一幅/多幅产生鱼眼畸变的棋盘格图像其他参数

输出:

内参K旋转向量rvecs平移向量tvecs畸变系数D

关于相机内参、外参(旋转向量+平移向量)的作用,请读者上网学习世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系,本文也不再赘述。

这里只给出如下公式:

以上公式是对一个正常的、无畸变的相机所成立的,因此没有用到畸变系数D。

而鱼眼相机的畸变,就发生在相机坐标系到像素坐标系的转换过程中。

2. fisheye::initUndistortRectifyMap();

fisheye::initUndistortRectifyMap()的作用是根据无畸变图的像素位置(i, j),推出它对应的畸变图中的像素位置(x, y),然后把畸变图中的(x, y)复制到新图中的(i, j),就得到了矫正图像。

fisheye::initUndistortRectifyMap()函数在OpenCV中的声明如下:

void cv::fisheye::initUndistortRectifyMap ( InputArray K, InputArray D, InputArray R, InputArray P, const cv::Size & size, int m1type, OutputArray map1, OutputArray map2 )

其中各形参的作用在网上有很多文章介绍,本文不再赘述。

这里只简单介绍其输入输出:

输入:

内参矩阵K畸变系数DR并非旋转向量/矩阵,矫正单目鱼眼相机时,R默认为单位矩阵若想使矫正后图片对应的内参与原相机内参不同,则把P设为新内参;否则,P与原内参相同输出矩阵map1的类型m1type其他参数

输出:

map1map2

我们通常把参数m1type设为CV_16SC2时,此时最重要的输出是map1:

根据CV_16SC2,map1此时是一个2通道的矩阵,每个点(i, j)都是一个2维向量,包含:

(i, j) [0](i, j) [1]

现在,我们令x = map1(i, j)[0], y= map1(i, j)[1]。

那么,i和j、x和y的含义是:

畸变图中坐标为(x, y)的像素点,在无畸变图中应该处于(i, j)位置。

这样,把畸变图(x, y)处的像素复制到(i, j)处,就得到了矫正后的图像。

即如下图所示:

而此时的map2是为了做插值、让矫正后图像更清晰而用,本文不做介绍。

注:

若把参数m1type设为CV_32FC1,则此时map1不再是二通道矩阵,而是一通道矩阵。

此时map1保存m1type为CV_16SC2时map1的0通道,map2保存m1type为CV_16SC2时map1的1通道。

即,此时令x = map1(i, j),y = map2(i, j),那么才有:

畸变图中坐标为(x, y)的像素点,在无畸变图中应该处于(i, j)位置。

3. remap()

remap()函数在OpenCV中的声明如下:

void cv::remap ( InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode = BORDER_CONSTANT, const Scalar & borderValue = Scalar() )

其中各形参的作用在网上有很多文章介绍,本文不再赘述。

这里只简单介绍其输入输出:

输入:

鱼眼畸变图srcmap1map2其他参数

输出:

矫正后的图像dst

remap()函数其实就是根据fisheye::initUndistortRectifyMap()生成的map1,如本文在上图中描述的那样,把畸变图src中坐标为(map1(i, j)[0], map1(i, j)[1])的点投影到输出图像dst的(i, j)处;再根据map2做一些清晰化处理,就完成了矫正。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3